package com.hatricks.is.common.dto;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

@Data
public class R<T> {
    // 状态码（推荐使用枚举类管理）
    private Integer code;
    // 提示信息
    private String message;
    // 核心数据（泛型支持任意类型）
    private T data;
    // 扩展数据（动态键值对）
    private Map<String, Object> extra = new HashMap<>();

    // 私有构造器（强制使用工厂方法）
    private R() {
    }

    /**
     * 成功静态工厂方法
     *
     * @param data 返回数据
     */
    public static <T> R<T> success(T data) {
        R<T> result = new R<>();
        result.code = ResultCodeEnum.SUCCESS.getCode();
        result.message = ResultCodeEnum.SUCCESS.getMessage();
        result.data = data;
        return result;
    }

    /**
     * 失败静态工厂方法
     *
     * @param errorCode 错误码枚举
     */
    public static <T> R<T> fail(ResultCodeEnum errorCode) {
        R<T> result = new R<>();
        result.code = errorCode.getCode();
        result.message = errorCode.getMessage();
        return result;
    }

    /**
     * 失败静态工厂方法
     */
    public static <T> R<T> fail(String message) {
        R<T> result = new R<>();
        result.code = -1;
        result.message = message;
        return result;
    }

    /**
     * 失败静态工厂方法
     */
    public static <T> R<T> fail(String message, T data) {
        R<T> result = new R<>();
        result.code = -1;
        result.message = message;
        result.data = data;
        return result;
    }


    /**
     * 链式设置扩展信息
     *
     * @param key   键名
     * @param value 键值
     */
    public R<T> addExtra(String key, Object value) {
        this.extra.put(key, value);
        return this;
    }
}